package com.atguigu.gmall.product;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 李旭
 * @date 2021/10/10 15:57
 * @Description:
 */
public class CompletableFutureDemo1 {

    public static void main(String[] args) throws Exception{
        System.out.println("主线程"+Thread.currentThread().getName());
        //1:创建新线程
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,//核心线程
                10,//最大线程
                5,// 闲置线程的存活时间  == 最大线程-核心线程
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                //工厂
                //拒绝策略
                new ThreadPoolExecutor.CallerRunsPolicy()
        );
        //子线程
/*        new Thread(() -> {
            try {
                int i = 10/0;//抛异常
            } catch (Exception e) {
                //e.printStackTrace();
                //处理一下  转人工 打日志   报警  发邮件  发短信
            }
        }).start();*/
        //不知道：子线程 出问题  主线程不知道

        CompletableFuture.supplyAsync(() -> {
            //int i = 10/0;
            System.out.println("上一个任务：" + Thread.currentThread().getName());
            //.....
            return "123";
        },threadPoolExecutor).whenCompleteAsync((t,u) -> {
            //计算完成时回调方法
            //1:处理返回值
            System.out.println("t:" + t);
            System.out.println("当前任务：" + Thread.currentThread().getName());
            //2:处理发生异常
            System.out.println("u:" + u);
        }).exceptionally((u) -> {
            System.out.println("u:" + u);
            System.out.println("下一个任务：" + Thread.currentThread().getName());
            return "处理成功";
        });




        System.out.println("抛出异常后的主线程"+Thread.currentThread().getName());
        //JVM   ： 栈中  私有区   共有区是堆
    }
}
